//*********************************************************
// Klasse Controller zum zusammenführen von GUI und Baum
//
//
//*********************************************************
package binarytree.controller;

import binarytree.model.Node;
import binarytree.model.Tree;
import binarytree.model.Tree.SelectedOrder;
import binarytree.view.View;
import binarytree.view.output.OutputSelectListOrderPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractAction;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class Controller {

    // Globale Variablendeklaration
    // Variablen um Referenz auf GUI- und Baum-Objekt zu halten.
    private View view;
    private Tree tree;

    // *****************************************************
    // Konstruktor : Controller zum Erzeugen des Objektes
    // Eingabe : Übergabe von Baum und GUI
    // Rückgabe: Keine
    // Ausgabe : Keine
    // *****************************************************
    public Controller(Tree tree, View view) {
        //Speichern der Referenzen auf GUI und Baum
        this.tree = tree;
        this.view = view;
        //Erzeugung und Zuordnung der Actionlistener-Objekte zu den GUI-Elementen
        this.view.getRightMenuPanel().addClearButtonActionListener(new ClearButtonActionListener());
        this.view.getRightMenuPanel().addGetValuesButtonActionListener(new SetValuesOnOffActionListener());
        this.view.getRightMenuPanel().getInputValuePanel().addAddValueButtonAction(new AddValueButtonActionListener());
        this.view.getRightMenuPanel().getOutputListPanel().getOutputSelectListOrderPanel().addOrderButtonAction(new AddOrderButtonActionListener());
        this.view.getLeftDrawPanel().getPanel().setTree(tree);
        this.view.getRightMenuPanel().getOutputListPanel().getOutputList().setModel(tree.getList());
        this.view.getRightMenuPanel().getOutputListPanel().getOutputList().addListSelectionListener(new AddListSelectionListener());
        this.view.getRightMenuPanel().addSetAvlCheckboxActionListener(new MakeAvlButtonActionlistener());
    }

    //****************************************************************
    // Actionlistener-Klassen die den GUI-Elementen zugeordnet werden
    //
    //
    //****************************************************************
    //******************************************************
    // Actionlistener für Ein-/Ausschalten von AVL-Funktion
    //******************************************************
    class MakeAvlButtonActionlistener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //prüfe ob AVL-Funktion an
            if (view.getRightMenuPanel().getSetAvlOnOffCheckbox().isSelected()) {
                //mache AVL-Baum
                tree.makeAVL();
                //zeichne neu
                view.getLeftDrawPanel().getPanel().repaint();
            }
        }

    }

    //****************************************************************************************
    // Actionlistener für KnotenLöschfunktion
    //****************************************************************************************
    class AddListSelectionListener implements MouseListener {

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            final JList list = (JList) e.getSource();
            list.setSelectedIndex(list.locationToIndex(e.getPoint()));

            JPopupMenu menue = new JPopupMenu("Context");
            JMenuItem item = new JMenuItem("Lösche " + tree.getList().elementAt(list.getSelectedIndex()));
            item.addActionListener(new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    tree.delete(tree.getList().elementAt(list.getSelectedIndex()));
                    tree.getValues();
                    if (view.getRightMenuPanel().getSetAvlOnOffCheckbox().isSelected()) {
                        tree.makeAVL();
                    }
                    tree.OrderList();
                    view.getLeftDrawPanel().getPanel().repaint();
                }
            });
            menue.add(item);
            menue.show(list, e.getX(), e.getY());
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    }

    //****************************************************************************************
    // Actionlistener für Baumlöschfunktion
    //****************************************************************************************    
    class ClearButtonActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            tree.clear();
            view.getLeftDrawPanel().getPanel().repaint();
        }
    }

    //****************************************************************************************
    // Actionlistener für Ein-/Ausschalten von Wertigkeiten
    //****************************************************************************************    
    class SetValuesOnOffActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            boolean onOff = view.getRightMenuPanel().getSetValuesOnOffCheckBox().isSelected();
            view.getLeftDrawPanel().getPanel().setValuesOnOff(onOff);
            view.getLeftDrawPanel().getPanel().repaint();
        }
    }

    //****************************************************************************************
    // Actionlistener für Hinzufügen von Konten
    //****************************************************************************************    
    class AddValueButtonActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String stringValue = view.getRightMenuPanel().getInputValuePanel().getInputTextField().getText();
            if (!stringValue.isEmpty()) {
                int value = Integer.parseInt(stringValue);
                tree.insert(new Node(value));
                tree.getValues();
                if (view.getRightMenuPanel().getSetAvlOnOffCheckbox().isSelected()) {
                    tree.makeAVL();
                }
                tree.OrderList();
                view.getRightMenuPanel().getInputValuePanel().getInputTextField().setText("");
                view.getLeftDrawPanel().getPanel().repaint();
            }
        }
    }

    //****************************************************************************************
    // Actionlistener für Auswahl von Sortierfunktion für Liste(Inorder, Preorder, Postorder)
    //****************************************************************************************    
    class AddOrderButtonActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            OutputSelectListOrderPanel panel = view.getRightMenuPanel().getOutputListPanel().getOutputSelectListOrderPanel();
            if (panel.getInOrderRadioButton().isSelected()) {
                tree.setOrder(SelectedOrder.INORDER);
                tree.OrderList();
            } else if (panel.getPreOrderRadioButton().isSelected()) {
                tree.setOrder(SelectedOrder.PREORDER);
                tree.OrderList();
            } else if (panel.getPostOrderRadioButton().isSelected()) {
                tree.setOrder(SelectedOrder.POSTORDER);
                tree.OrderList();
            }
        }

    }

}
